package br.edu.ufcg.p1.barzin;

import static br.edu.ufcg.p1.barzin.util.PrefManConstants.TABLET_ID;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.content.Context;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import br.edu.ufcg.p1.barzin.async.EnviaMsgTask;
import br.edu.ufcg.p1.barzin.async.MesaMsgsTask;
import br.edu.ufcg.p1.barzin.async.RecuperaMsgsTask;
import br.edu.ufcg.p1.barzin.async.TotalMsgsTask;
import br.edu.ufcg.p1.barzin.event.Assinante;
import br.edu.ufcg.p1.barzin.event.EventBus;
import br.edu.ufcg.p1.barzin.event.MesasMsgsEvento;
import br.edu.ufcg.p1.barzin.event.MsgEnviadaEvento;
import br.edu.ufcg.p1.barzin.event.MsgsRecuperadasEvento;
import br.edu.ufcg.p1.barzin.event.TiposDeEventos;
import br.edu.ufcg.p1.barzin.model.Mensagem;
import br.edu.ufcg.p1.barzin.model.MesaMensagem;

public class MensagemFragment extends Fragment implements
		Assinante<MsgEnviadaEvento> {

	private MesaMsgArrayAdapter mesaMsgAdapter;
	private Integer remetente;
	private MsgArrayAdapter msgAdapter;

	private Integer remetenteAtual;
	
//	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		final View view = inflater.inflate(R.layout.mensagens_fragment,
				container, false);

		((TextView) view.findViewById(R.id.titleMensagensFrag)).setTextSize(35);

		ListView lv = (ListView) view.findViewById(R.id.mensagensListagemMesas);

		mesaMsgAdapter = new MesaMsgArrayAdapter(getActivity(),
				R.layout.mesa_msg_list_item);
		lv.setAdapter(mesaMsgAdapter);

		ListView lv2 = (ListView) view.findViewById(R.id.mensagensListagemMsgs);

		msgAdapter = new MsgArrayAdapter(getActivity(), R.layout.chat_list_item);
		lv2.setAdapter(msgAdapter);

		Button bt = (Button) view.findViewById(R.id.mensagensBtnEnviar);
		bt.setOnClickListener(new OnClickListener() {
//			@Override
			public void onClick(View v) {
				if (remetente == -1) {
					Toast.makeText(App.environment().getContext(),
							"Necessario selecionar uma mesa", Toast.LENGTH_LONG)
							.show();
				} else {
					String msg = ((EditText) view
							.findViewById(R.id.mensagensNovoTexto)).getText()
							.toString();
					Mensagem m = new Mensagem(null, null, remetente, null, msg,
							null);
					new EnviaMsgTask().execute(m);
					((EditText) view
							.findViewById(R.id.mensagensNovoTexto)).setText("");
				}
			}
		});

		remetente = -1;
		return view;
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		populaDados();
		EventBus.getInstance().registraAssinante(TiposDeEventos.MSG_ENVIADA,
				this);
	}

	public void populaDados() {
		new MesaMsgsTask().execute();
	}
	
	public Integer getRemetenteAtual() {
		return this.remetenteAtual;
	}

	class MesaMsgArrayAdapter extends ArrayAdapter<MesaMensagem> implements
			Assinante<MesasMsgsEvento> {

		public MesaMsgArrayAdapter(Context context, int textViewResourceId) {
			super(context, textViewResourceId);

			EventBus.getInstance().registraAssinante(
					TiposDeEventos.MSGS_POR_REMETENTE, this);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			final MesaMensagem mesaMsg = getItem(position);

			// if (itemView == null) {
			convertView = getLayoutInflater(getArguments()).inflate(
					R.layout.mesa_msg_list_item, null);
			// }

			((TextView) convertView.findViewById(R.id.mesaMsgNome))
					.setText(mesaMsg.getNomeRemetente());
			((TextView) convertView.findViewById(R.id.mesaMsgNome))
					.setTextColor(0xFFFFD700);
			((TextView) convertView.findViewById(R.id.mesaMsgTotal))
					.setText(" (" + mesaMsg.getQuantidade() + ")");

			if (mesaMsg.getQuantidade() > 0) {
				((TextView) convertView.findViewById(R.id.mesaMsgTotal))
						.setTextColor(0xFF74D700);
				((TextView) convertView.findViewById(R.id.mesaMsgTotal))
						.setTypeface(null, Typeface.BOLD);
			} else {
				((TextView) convertView.findViewById(R.id.mesaMsgTotal))
						.setTextColor(0xFFFFFFFF);
				((TextView) convertView.findViewById(R.id.mesaMsgTotal))
						.setTypeface(null, Typeface.NORMAL);
			}

			final TextView tv = ((TextView) MensagemFragment.this.getView()
					.findViewById(R.id.mensagensChatComMesa));

			convertView.setClickable(true);
			convertView.setOnClickListener(new OnClickListener() {
//				@Override
				public void onClick(View v) {
					remetente = mesaMsg.getIdRemetente();
					if (tv != null) {
						tv.setText(mesaMsg.getNomeRemetente());
						tv.setTextSize(25);
						tv.setTextColor(0xFFFFD700);
					}

					if (mesaMsg.getQuantidade() > 0) {
						new RecuperaMsgsTask().execute(mesaMsg.getIdRemetente());
						mesaMsg.setCarregar(false);
					} else {
						msgAdapter.carregaConversas(mesaMsg.getIdRemetente());
					}
				}
			});

			return convertView;
		}

//		@Override
		public void trataEvento(MesasMsgsEvento evento) {
			List<MesaMensagem> mensagens = evento.getDado().getLista();
			List<MesaMensagem> remove = new ArrayList<MesaMensagem>();

			boolean aux = false;
			
			for (int i = 0; i < this.getCount(); i++) {
				MesaMensagem mm = this.getItem(i);
				if (mensagens.contains(mm)) {
					MesaMensagem mm2 = mensagens.get(mensagens.indexOf(mm));
					mm.setNomeRemetente(mm2.getNomeRemetente());
					mm.setQuantidade(mm2.getQuantidade());
					if (mm2.getIdRemetente() == getRemetenteAtual() && mm2.getQuantidade() > 0) {
						Log.d("aqui estou", getRemetenteAtual()+"");
						aux = true;
//					} else {
//						Log.d("aqui nao estou", getRemetenteAtual()+"->"+mm2.getIdRemetente());
//						if (mm2.getQuantidade() > 0) {
//						}
//						mm.setCarregar(true);
						
					}
				} else {
					remove.add(mm);
				}
			}

			for (MesaMensagem mesaMensagem : mensagens) {
				if (getPosition(mesaMensagem) < 0) {
					this.add(mesaMensagem);
				}
			}

			for (MesaMensagem mm : remove) {
				if (getPosition(mm) >= 0) {
					this.remove(mm);
				}
			}

			this.notifyDataSetChanged();
			
			if(aux) {
				new RecuperaMsgsTask().execute(getRemetenteAtual());
			}
			
		}

	}

	class MsgArrayAdapter extends ArrayAdapter<Mensagem> implements
			Assinante<MsgsRecuperadasEvento> {

		public MsgArrayAdapter(Context context, int textViewResourceId) {
			super(context, textViewResourceId);

			EventBus.getInstance().registraAssinante(
					TiposDeEventos.MSGS_RECUPERADAS, this);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Mensagem resumo = getItem(position);

			convertView = getLayoutInflater(getArguments()).inflate(
					R.layout.chat_list_item, null);

			
			String horario = "";
			switch (position) {
			case 0:
				horario = "21:23:45";
				break;
			case 1:
				horario = "21:24:02";
				break;
			case 2:
				horario = "21:25:32";
				break;
			case 3:
				horario = "21:26:14";
				break;
			case 4:
				horario = "21:28:15";
				break;
			}
			
			
			((TextView) convertView.findViewById(R.id.chatMsgHora)).setText("["
					+ horario + "] ");
			((TextView) convertView.findViewById(R.id.chatMsgRemetente))
					.setText(" <" + resumo.getNomeRemetente() + "> ");
			((TextView) convertView.findViewById(R.id.chatMsgConteudo))
					.setText(resumo.getMensagem());

			if (resumo.isVerde()) {
				((TextView) convertView.findViewById(R.id.chatMsgHora)).setTextColor(0xFF74D700);
				((TextView) convertView.findViewById(R.id.chatMsgRemetente))
						.setTextColor(0xFF74D700);
				((TextView) convertView.findViewById(R.id.chatMsgConteudo))
						.setTextColor(0xFF74D700);
				
				((TextView) convertView.findViewById(R.id.chatMsgHora)).setTypeface(null, Typeface.BOLD);
				((TextView) convertView.findViewById(R.id.chatMsgRemetente))
						.setTypeface(null, Typeface.BOLD);
				((TextView) convertView.findViewById(R.id.chatMsgConteudo))
						.setTypeface(null, Typeface.BOLD);
			}
			
			return convertView;
		}

		public void carregaConversas(Integer integer) {
			Log.d("carregaconv", "com o remetente: " + integer);
			remetenteAtual = integer;
			
			for (int i = this.getCount() - 1; i >= 0; i--) {
				this.remove(this.getItem(i));
			}

			Integer idTablet = App.environment().getSharedPreferences()
					.getInt(TABLET_ID, -1);
			
			Log.d("vou recuperar as msgs", idTablet + " : " + integer);		
			
			List<Mensagem> msgs = App.environment().getDao()
					.recuperaMensagens(integer, idTablet);
			// for (Mensagem mensagem : msgs) {
			// this.add(mensagem);
			// }

			
			msgs.addAll(App.environment().getDao()
					.recuperaMensagens(idTablet, integer));

			Collections.sort(msgs, new Comparator<Mensagem>() {
//				@Override
				public int compare(Mensagem object1, Mensagem object2) {
					return object1.getHorario().compareTo(object2.getHorario());
				}
			});

			for(int i = msgs.size()-1; i >= 0; i--){
				if (msgs.get(i).getIdRemetente() != idTablet) {
					msgs.get(i).setVerde(true);
				} else {
					break;
				}
			}
			
			for (Mensagem mensagem : msgs) {
				this.add(mensagem);
			}

			this.notifyDataSetChanged();
		}

//		@Override
		public void trataEvento(MsgsRecuperadasEvento evento) {
			carregaConversas(evento.getDado());
			new TotalMsgsTask().execute();
			populaDados();
		}

	}

//	@Override
	public void trataEvento(MsgEnviadaEvento evento) {
		if (evento.getDado() == remetente) {
			msgAdapter.carregaConversas(remetente);
		}
		
		try {
			InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
			inputManager.hideSoftInputFromWindow(this.getView().getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}